/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package muhnes.sizoo.validador;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
 
public class FechaValidator implements Validator{
    
    private final String patronFecha = "^([[0-2]\\d|3[0|1])/(0\\d|1[0-2])/([19|2\\d]\\d{2})$";
    private SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
    
    @Override
    public void validate(FacesContext contexto, UIComponent componente, Object valor)
        throws ValidatorException {
        
        String opc = (String) componente.getAttributes().get("opcional");
        boolean opcional = opc != null && !opc.isEmpty() ? Boolean.parseBoolean(opc) : false;
        
        String min = (String) componente.getAttributes().get("minimo");
        Date fechaMinima = new Date( Long.MIN_VALUE );
        try {
            fechaMinima = min != null && min.matches( patronFecha ) ? formatoFecha.parse( min ) : fechaMinima;
        } catch (ParseException ex) {
            Logger.getLogger(FechaValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        String max = (String) componente.getAttributes().get("maximo");
        Date fechaMaxima = new Date( Long.MAX_VALUE );
        try {
            fechaMaxima = max != null && max.matches( patronFecha ) ? formatoFecha.parse( max ) : fechaMaxima;
        } catch (ParseException ex) {
            Logger.getLogger(FechaValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
         
        String fch = (String) valor;
        Date fecha = null;
        try {
            fecha = fch != null && max.matches( patronFecha ) ? formatoFecha.parse( fch ) : null;
        } catch (ParseException ex) {
            Logger.getLogger(FechaValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        if( fecha == null && !opcional ) {
            FacesMessage mensaje = new FacesMessage();
            mensaje.setSeverity( FacesMessage.SEVERITY_ERROR );
            mensaje.setSummary( "El campo debe ser una fecha válida." );
            mensaje.setDetail( "El campo es obligatorio y debe tener el formato dd/mm/aaaa." );
            contexto.addMessage( componente.getClientId(), mensaje );
            throw new ValidatorException( mensaje );
        }
        else if( (fecha.before( fechaMinima ) || fecha.after( fechaMaxima )) && !opcional ) {
            FacesMessage mensaje = new FacesMessage();
            mensaje.setSeverity( FacesMessage.SEVERITY_ERROR );
            mensaje.setSummary( "El valor esta fuera de rango." );
            mensaje.setDetail( String.format("El valor debe estar entre {0} y {1}", fechaMinima, fechaMaxima ) );
            contexto.addMessage( componente.getClientId(), mensaje );
            throw new ValidatorException( mensaje );
        }
        
    }
    
}
